package com.lihepeng.leecode.linkedList;

import org.junit.Test;

/**
 * 给你一个链表的头节点 head ，旋转链表，将链表每个节点向右移动 k 个位置。
 * 1>2>3 k= 2
 * 2>3>1
 */
public class Solution61 {
    // 封闭成环的解法

    /**
     * 先将 链表变换成环状，然后在旋转完成之后将环打开
     * @param head
     * @param k
     * @return
     */
    public ListNode rotateRight(ListNode head, int k) {
        if (head ==null || head.next == null || k ==0){
            return head;
        }
        // 计算链表的长度
        ListNode headNode = head;
        int nodeSize = 1;
        while (headNode!=null && headNode.next!=null){
            headNode = headNode.next;
            nodeSize++;
        }
        // 只需要移动k mod nodeSize 就可以了
        // k为节点长度的倍数
        int add = nodeSize -k % nodeSize;
        if (add == 0){
            return head;
        }
        headNode.next = head;
        while(add -- >0){
            headNode = headNode.next;
        }
        ListNode curNode = headNode.next;
        headNode.next = null;
        return curNode;
    }
    @Test
    public void runTest(){
        ListNode l0= new ListNode(0);
        ListNode l1= new ListNode(1);
        ListNode l2= new ListNode(2);
        l0.next = l1;
        l1.next = l2;
        rotateRight(l0,4);

    }
}
